home *** CD-ROM | disk | FTP | other *** search
/ NeXT Enterprise Objects Framework 1.1 / NeXT Enterprise Objects Framework 1.1.iso / NextDeveloper / Examples / EnterpriseObjects / RadioMatrixAssociation / RadioAssociation.m < prev    next >
Encoding:
Text File  |  1994-09-16  |  3.5 KB  |  157 lines

  1. /* RadioAssociation.m
  2.  *
  3.  * You may freely copy, distribute, and reuse the code in this example.
  4.  * NeXT disclaims any warranty of any kind, expressed or  implied, as to its
  5.  * fitness for any particular use.
  6.  *
  7.  *  
  8.  *
  9.  */
  10.  
  11. #import <appkit/appkit.h>
  12. #import <eointerface/eointerface.h>
  13.  
  14. #import "RadioAssociation.h"
  15.  
  16. // Add a category to ButtonCell class to recognize the RadioAssociation
  17. // for Radio Buttons.
  18.  
  19. @implementation ButtonCell (RadioAssociation)
  20. - (Class)matrixAssociationClass:matrix
  21. {
  22.     const char *iconname;
  23.  
  24.     if (([matrix mode] == NX_RADIOMODE)
  25.             && (iconname = [self icon])
  26.             && !strcmp(iconname, "NXradio"))
  27.         return [RadioAssociation class];
  28.     else
  29.         return [EOMatrixAssociation class];
  30. }
  31. @end
  32.  
  33.  
  34. // Override the standard matrix associationClass method to spot radio
  35. // associations
  36.  
  37. @implementation Matrix (RadioAssoc)
  38. - (Class)associationClass
  39. {
  40.     id acell;
  41.  
  42.     //  Determine if we're a matrix of radio buttons!
  43.     acell = [self cellAt:0:0];
  44.     if (acell && [acell respondsToSelector:@selector(matrixAssociationClass:)])
  45.         return [acell matrixAssociationClass:self];
  46.     
  47.     // Use the generic association 
  48.     return [EOMatrixAssociation class];
  49. }
  50.  
  51. @end
  52.  
  53.  
  54. @implementation RadioAssociation
  55.  
  56. - initWithController:(EOController *)aController
  57.     key: (NSString *)aKey destination: aDest
  58. {
  59.     [super initWithController:aController key: aKey destination:aDest];
  60.  
  61.     // This is needed to get rid of warning about multiple declarations. 
  62.     [(Matrix *)aDest setTarget:self];
  63.     [aDest setAction:@selector(controlActed:)];
  64.  
  65.     // Allow empty selection for instances when the EO value doesn't
  66.     // match any of the values
  67.     
  68.     [aDest setEmptySelectionEnabled:YES]; 
  69.     return self;
  70. }
  71.  
  72. - controlActed:sender
  73. {
  74.     [controller associationDidEdit: self];
  75.     return self;
  76. }
  77.  
  78.  
  79. // Return the selected cell string, or NULL if no cell is selected
  80.  
  81. - value
  82. {
  83.     const char *title = [[destination selectedCell] title];
  84.     if (title) 
  85.         return [NSString stringWithCString:title];
  86.       else  
  87.         return [EONull null];
  88.  
  89. }
  90.  
  91. - (NSString *)currentValue
  92. {
  93.     NSArray *selectedObjects = [controller selectedObjects];
  94.     NSString *stringValue;
  95.     
  96.     if ([selectedObjects count] >= 1) {
  97.         id selectedObject, aDict, val;
  98.         id array = [[[NSArray alloc] initWithObjects: key, 0] autorelease];
  99.     
  100.         selectedObject = [selectedObjects objectAtIndex: 0];
  101.         aDict = [selectedObject valuesForKeys: array];
  102.         val = [aDict objectForKey: key];
  103.         if (!val)
  104.                 stringValue = @"";
  105.         else
  106.             stringValue = [((NSObject *)val) description];      
  107.     } else {
  108.         stringValue = @"";
  109.     }
  110.  
  111.     return stringValue;
  112. }
  113.  
  114. - (void)selectionDidChange
  115. {
  116.     [self contentsDidChange];
  117. }
  118.  
  119. //
  120. // If no cell matches title, then an empty selection is set
  121. //
  122. - (void)selectCellWithTitle:(NSString *)title
  123.   {
  124.     int col,row,numrows,numcols;
  125.     const char *titleCString = [title cString];
  126.  
  127.     [destination getNumRows:&numrows numCols:&numcols];
  128.     for(col=0; col<numcols;col++) {
  129.         for(row=0; row<numrows; row++) {
  130.         id cell = [destination cellAt:row :col];
  131.         if (cell && !strcmp([cell title], titleCString)) {
  132.             [destination selectCellAt:row :col];
  133.         return;
  134.         }
  135.     }
  136.     }
  137.     
  138.     // Clear the selection if no matching cell is found.
  139.     [destination selectCellAt:-1 :-1];
  140. }
  141.  
  142. - (void)contentsDidChange
  143. {
  144.     [self selectCellWithTitle:[self currentValue]];
  145.  
  146.     // If there's not exactly one object selected, disable the control
  147.     
  148.     if ([[controller selectedObjects] count] == 1)
  149.         [destination setEnabled:YES];
  150.     else
  151.         [destination setEnabled:NO];
  152. }
  153.  
  154. @end
  155.  
  156.  
  157.